// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "GameFramework/CheatManager.h"
#include "LyraCheatManager.generated.h"

class ULyraAbilitySystemComponent;

#ifndef USING_CHEAT_MANAGER
#define USING_CHEAT_MANAGER (1 && !UE_BUILD_SHIPPING) // 定义是否使用作弊管理器（非发布版本启用）
#endif // #ifndef USING_CHEAT_MANAGER

DECLARE_LOG_CATEGORY_EXTERN(LogLyraCheat, Log, All); // 声明日志类别

/**
 * ULyraCheatManager
 *
 *	该项目使用的基础作弊管理器类。
 */
UCLASS(config = Game, Within = PlayerController, MinimalAPI)
class ULyraCheatManager : public UCheatManager
{
	GENERATED_BODY()

public:

	ULyraCheatManager();

	virtual void InitCheatManager() override;

	// 将文本输出到控制台和日志的辅助函数。
	static void CheatOutputText(const FString& TextToOutput);

	/**
	 * 在服务器上为拥有玩家运行作弊命令。
	 */
	UFUNCTION(exec)
	void Cheat(const FString& Msg);

	/**
	 * 在服务器上为所有玩家运行作弊命令。
	 */
	UFUNCTION(exec)
	void CheatAll(const FString& Msg);

	/**
	 * 开始下一场比赛。
	 */
	UFUNCTION(Exec, BlueprintAuthorityOnly)
	void PlayNextGame();

	/**
	 * 切换固定摄像机。
	 */
	UFUNCTION(Exec)
	virtual void ToggleFixedCamera();

	/**
	 * 循环切换调试摄像机。
	 */
	UFUNCTION(Exec)
	virtual void CycleDebugCameras();

	/**
	 * 循环切换技能系统调试信息。
	 */
	UFUNCTION(Exec)
	virtual void CycleAbilitySystemDebug();

	/**
	 * 强制取消输入激活的技能。用于追踪技能中断错误。
	 */
	UFUNCTION(Exec, BlueprintAuthorityOnly)
	virtual void CancelActivatedAbilities();

	/**
	 * 向拥有玩家的技能系统组件添加动态标签。
	 */
	UFUNCTION(Exec, BlueprintAuthorityOnly)
	virtual void AddTagToSelf(FString TagName);

	/**
	 * 从拥有玩家的技能系统组件移除动态标签。
	 */
	UFUNCTION(Exec, BlueprintAuthorityOnly)
	virtual void RemoveTagFromSelf(FString TagName);

	/**
	 * 对拥有玩家施加指定伤害值。
	 */
	UFUNCTION(Exec, BlueprintAuthorityOnly)
	virtual void DamageSelf(float DamageAmount);

	/**
	 * 对玩家正在观察的目标角色施加指定伤害值。
	 */
	virtual void DamageTarget(float DamageAmount) override;

	/**
	 * 对拥有玩家施加指定治疗量。
	 */
	UFUNCTION(Exec, BlueprintAuthorityOnly)
	virtual void HealSelf(float HealAmount);

	/**
	 * 对玩家正在观察的目标角色施加指定治疗量。
	 */
	UFUNCTION(Exec, BlueprintAuthorityOnly)
	virtual void HealTarget(float HealAmount);

	/**
	 * 施加足以杀死拥有玩家的伤害。
	 */
	UFUNCTION(Exec, BlueprintAuthorityOnly)
	virtual void DamageSelfDestruct();

	/**
	 * 防止拥有玩家受到任何伤害。
	 */
	virtual void God() override;

	/**
	 * 防止拥有玩家的生命值低于1点。
	 */
	UFUNCTION(Exec, BlueprintAuthorityOnly)
	virtual void UnlimitedHealth(int32 Enabled = -1);

protected:

	virtual void EnableDebugCamera() override;
	virtual void DisableDebugCamera() override;
	bool InDebugCamera() const;

	virtual void EnableFixedCamera();
	virtual void DisableFixedCamera();
	bool InFixedCamera() const;

	void ApplySetByCallerDamage(ULyraAbilitySystemComponent* LyraASC, float DamageAmount); // 应用由调用者设定的伤害
	void ApplySetByCallerHeal(ULyraAbilitySystemComponent* LyraASC, float HealAmount); // 应用由调用者设定的治疗

	ULyraAbilitySystemComponent* GetPlayerAbilitySystemComponent() const; // 获取玩家技能系统组件
};